package com.github.manx98.okdownloader.utils;

import java.io.IOException;
import java.util.List;

/**
 * 进度处理器
 *
 * @author : manx98
 * @date : 2021/5/26
 */
public interface ProgressHandler extends AutoCloseable {

    /**
     * 更新下载块开始位置
     *
     * @param progressInfo 下载块
     * @throws IOException IO异常
     */
    void updateStartProgress(DownloadBlockInfo progressInfo) throws IOException;

    /**
     * 更新下载块结束位置
     *
     * @param progressInfo 下载块
     * @throws IOException IO异常
     */
    void updateEndProgress(DownloadBlockInfo progressInfo) throws IOException;

    /**
     * 更新start-end区间
     *
     * @param progressInfo 下载块
     * @throws IOException IO异常
     */
    void updateProgress(DownloadBlockInfo progressInfo) throws IOException;

    /**
     * 当线程终止时触发
     */
    default void onThreadTermination() {
    }

    /**
     * 已完成的数据长度
     *
     * @return byte
     */
    long getCompletedSize();

    /**
     * 下载文件长度
     *
     * @return 长度
     */
    long getFileSize();

    /**
     * 获取下载块列表
     *
     * @return 下载块列表, 必须使用线程安全类
     */
    List<DownloadBlockInfo> getDownloadBlockProgressInfos();

    /**
     * 获取最小拆分大小
     *
     * @return 字节数
     */
    long getMinSplitSize();

    /**
     * 最大拆分大小
     *
     * @return 字节数
     */
    long getMaxSplitSize();

    /**
     * 获取最大下载线程数量
     *
     * @return 下载线程数量
     */
    int getMaxWorkers();
}
